package com.xl.juc.tvolatile;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * volatile 不保证原子性  （要么全部执行，要么全不执行）
 * @author Charley
 * @create 2021-03-07
 */
public class VDemo02 {

    public static volatile AtomicInteger num= new AtomicInteger();

    //不加synchronized 或者 lock 时，怎么保证原子性？ 使用原子类的封装类
    private  static void  add(){
      //  num++;//不是一个原子操作
        num.getAndIncrement();//AtomicInteger 在内存中修改值，不是简单的 num++
    }
    public static void main(String[] args) {
        for (int i = 1; i <=20 ; i++) {
           new Thread(()->{
               for (int j = 0; j <1000 ; j++) {
                add();
               }
           }).start();
        }

        while (Thread.activeCount()>2){// main 和gc 线程存在
            Thread.yield();//线程让步,一个线程使用了这个方法之后，它就会把自己CPU执行的时间让掉，让自己或者其它的线程运行。
        }
        System.out.println(Thread.currentThread().getName()+":num:"+num);

    }
}
